<?php
/*
 * Đây là kỹ thuật lazy loading trong OOP, được sử dụng để triệu nạp file controller trong từng module
* của zend framework.
* Riêng đối với module default là module mặc định nên trong class controller ta không cần khai báo thêm tên module giống với module admin.
*/

class UserController extends Zend_Controller_Action{
	public function indexAction(){
		$muser=new Model_User;
		echo "<pre>";
		//var_dump($muser->listall());
		//var_dump($muser->listall2());
		var_dump($muser->listuser4());
		echo "</pre>";
	}
	
	public function paginatorAction()
	{
		/*+ Trước tiên ta nạp model user vào để gọi phương thức listall().
+ Tiếp tục ta khởi tạo lớp Zend_Paginatior và truyền tham số lấy được từ model qua. Tham số này là một mảng liệt kê toàn bộ thành viên có trong bảng.
+ Kế tới ta cấu hình số lượng dữ liệu hiển thị trên trang. Cụ thể trong bài ta đang quy ước là 3 dòng dữ liệu trên 1 trang.
+ Ta cấu hình hiển thị 1 lần chỉ 3 trang.
+ Lấy trang hiện hành và mặc định sẽ là trang một.
+ Đưa tham số trang hiện hành vào phương thức setCurrentPageNumber()
+ Cuối cùng, ta đổ dữ liệu ra view.
		*/
		
		$muser=new Model_User;
		$paginator = Zend_Paginator::factory($muser->listall());
		$paginator->setItemCountPerPage(3);
		$paginator->setPageRange(3);
		$currentPage = $this->_request->getParam('page',1);
		$paginator->setCurrentPageNumber($currentPage);
		$this->view->data=$paginator;
	}
	
	/*
	Về mặt cơ bản thì Zend_Paginator làm công việc đưa tất cả record của câu truy vấn vào trong 1 mảng dữ liệu. 
	Sau đó nó phân trang trực tiếp từ dữ liệu trong mảng này. 
	Điều này trên thực tế thì chỉ có thể đáp ứng được với mô hình dữ liệu nhỏ, 
	vì nếu dùng với hàng trăm ngàn dòng dữ liệu thì có lẽ việc đem chúng đổ vào mảng thôi cũng là điều không đơn giản.
	Nhóm phát triển Zend Framework cũng hiểu những khó khăn từ phía người sử dụng về điều này, nên các phiên bản sau này của zend đã hỗ trợ thêm nhiều phương thức nhằm giải quyết bài toán này.
	Đó là sử dụng thêm phương thức bên dưới với các tham số truyền vào, trước khi gọi lớp Zend_Paginator.
	
	Truyền phương thức listall3() vào lớp Zend_Paginator_Adapter_DbSelect. 
	Tại đó, tự nó sẽ biết phải lấy dữ liệu như thế nào. Cuối cùng, thay vì ta dùng Zend_Paginator::factory() thì nay ta khởi tạo hẳn một phương thức và truyền dữ liệu mà ta đã cấu hình ở trên vào. 
	*/
	public function paginator2Action(){
		$muser=new Model_User;
		$adapter = new Zend_Paginator_Adapter_DbSelect($muser->listall3());
		$paginator = new Zend_Paginator($adapter);
		$paginator->setItemCountPerPage(3);
		$paginator->setPageRange(3);
		$currentPage = $this->_request->getParam('page',1);
		$paginator->setCurrentPageNumber($currentPage);
		$this->view->data=$paginator;
		
		/*Chạy ứng dụng, bạn sẽ thấy kết quả giống với lúc ta dùng ở trên.
Vậy liệu chúng có khác gì không ?. 
Vì dẫu sao cả hai cùng làm công việc hiển thị toàn bộ dữ liệu cơ mà ?.
 Them doan sau vao file view 
 
 <?php
        echo "<pre>";
        print_r($this->data);
        echo "</pre>";
?> 
Và kết quả thật sự bất ngờ phải không nào, trong mảng dữ liệu của chúng ta hoàn toàn không có dòng nào liên quan đến dữ liệu có trong bảng cả. Vậy Zend_Paginator tự hiểu và tự giới hạn dữ liệu trả về giúp cho chúng ta. Ngay trên manual của Zend Framework cũng nhấn mạnh về điều này khi bạn sử dụng thêm lớp Zend_Paginator_Adapter_DbSelect().

Additionally these adapters do not fetch all records from the database in order to count them. 
Instead, the adapters manipulates the original query to produce the corresponding COUNT query. 
Paginator then executes that COUNT query to get the number of rows. 
This does require an extra round-trip to the database, but this is many times faster than fetching an entire result set and using count(). 
Especially with large collections of data. 
*/
	}
	
	public function formAction(){
		$form=new Form_User;
		if($this->_request->isPost()){
			$name=$this->_request->getPost('name');			
			//Lấy các tham số còn lại
			echo "Name vừa post là $name";
		}
       	$this->view->form=$form;
       	
       	
       	$form_upload = new Form_File;
       	
       	if($this->_request->isPost()){
       		$upload = new Form_UploadFile_UploadFile;
       		$files = $upload->_upload->getFileInfo();
       		foreach($files as $file=>$info){
       			if(!$upload->_upload->isValid($file)){
       				echo "File khong hop le chan vai";
       			}
       			
       			if(!$upload->_upload->isUploaded($file)){
       				echo "Chua chon file";
       			}
       			
       		}
       		$upload->_upload->receive();
       	}
       	$this->view->form_upload = $form_upload;
	}
	
}